{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lab 05 Logistic Classification(Regression)\n",
    "* Logistic Classfication은 True or False와 같은 Binary나 복수개의 다항 분류에 쓰입니다 (Bernoulli Distribution)\n",
    "\n",
    "### 기본 Library 선언 및 Tensorflow 버전 확인"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.10.0\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import tensorflow as tf\n",
    "\n",
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 강의에 설명할 Data입니다\n",
    "* x_data가 2차원 배열이기에 2차원 공간에 표현하여 x1과 x2를 기준으로 y_data 0과 1로 구분하는 예제입니다\n",
    "* Logistic Classification 통해 보라색과 노란색 y_data(Label)을 구분해 보겠습니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEKCAYAAAAB0GKPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAF/dJREFUeJzt3X20XXV95/H3JzeXJCQIApcHCSHMFG1RedAr6IAKukRwtMjUWlgOOlaapaMOtIwdZVahUrtmqavO2FGhWUJBC1gVaBlHHuKUKT4MyE14flBTwCEZJIEIBAJ5/M4fd6cew02yA3fnJPe+X2udlXN++7fP/u78cT9n//bvnF+qCkmStmZKvwuQJO0cDAxJUisGhiSpFQNDktSKgSFJasXAkCS1YmBIkloxMCRJrRgYkqRWpva7gPG0995719y5c/tdhiTtNBYuXPhYVQ216TuhAmPu3LmMjIz0uwxJ2mkk+Xnbvg5JSZJaMTAkSa0YGJKkVgwMSVIrBoYkqRUDQ5LUSmeBkWR6kh8nuSPJPUk+PUafaUn+NsniJLckmduz7VNN+0+SvL2rOiebZ558hi+feTG/u++H+N39zuCCP7qEVSuf7XdZGkdVxYZV32LD8hPY8Ohr2bDiD6i1P+13WZ2qDU+w4clPs+HRo9mw7F+xYeXnqA2r+l3WhJOulmhNEmBmVT2dZBD4AXBmVd3c0+ffA4dV1YeTnAqcUlW/l+RQ4ArgKOBlwPeAl1fV+i0dc3h4uPwexuatX7+eDx/5CZb+7BHWrl4HwOC0qRz4mwdwwcLPMWWKF5wTwYaVX4RnLgY2fhAIZAbZ62oy9eB+ltaJqjXUY++C9UuAtU3rNBh8BdnzW4z+KdLmJFlYVcNt+nb2F6JGPd28HGwem6bTycClzfNvA29tguZk4BtVtbqqHgQWMxoeehF+/N3bePSh5f8cFgBrV6/jkX96lJHr7+hjZRovteEZeOYifhUWAAX1HPX0Bf0qq1vPfQ/WP8qvwgJgNaxbDGt+3K+qJqROP1ImGUhyO7AMWFBVt2zS5QDgYYCqWgc8CezV295Y0rTpRVi86EGeffq557WvXrWaxbc92IeKNO7W/1/IWD/gsAHWTswPBbX2LmCM4adaC+vu3e71TGSdBkZVra+qI4DZwFFJXjXex0gyL8lIkpHly5eP99tPKPv9i32YMWv689qn7TqN/Q7epw8VadwN7Au1ZjPbDtq+tWwnmXoQMGOMDbvAwOztXs9Etl0GravqCeBG4MRNNi0FDgRIMhXYHXi8t70xu2kb673nV9VwVQ0PDbX6/axJ603veT3Tdt2FTPnVmO6UKWH6rOkce4ojfhNBpuwJ098ObPrBYDqZ9ZF+lNS96e+ETAN671UMQHaDacf1qaiJqctZUkNJ9miezwDeBty/SbdrgA80z98D/EON3oW/Bji1mUV1MHAI4GDkizRtxjS++MM/59A3vJyBwQEGBgc49JhX8MUffoZdpu/S7/I0TrL7f4EZ7wamAYMwZX+yx38luxzZ79I6kSmzyF7fgMHDGP091amwyzDZ628ZnW+j8dLlLKnDGL2hPcBoMH2zqs5Pcj4wUlXXJJkOfB04ElgBnFpVDzT7/2fg94F1wFlVde3WjuksqfZWrXyWBGbMGuNSXhNC1RqoVZDdJ81ModrwNDCFTNm136XsNLZlllRngdEPBoYkbZsdYlqtJGliMTAkSa0YGJKkVgwMSVIrBoYkqRUDQ5LUioEhSWrFwJAktWJgSJJaMTAkSa0YGJKkVgwMSVIrBoYkqRUDQ5LUioEhSWplrNXix0WSA4GvAfsCBcyvqi9u0ucTwPt6avktYKiqViR5CFgJrAfWtf29dklSNzoLDEZXyju7qhYl2Q1YmGRBVd27sUNVfR74PECSdwF/WFUret7j+Kp6rMMaJUktdTYkVVWPVNWi5vlK4D7ggC3schpwRVf1SJJenO1yDyPJXEbX7b5lM9t3BU4EruxpLuCGJAuTzOu6RknSlnU5JAVAklmMBsFZVfXUZrq9C/jhJsNRx1bV0iT7AAuS3F9VN43x/vOAeQBz5swZ5+olSRt1eoWRZJDRsLisqq7aQtdT2WQ4qqqWNv8uA64Gjhprx6qaX1XDVTU8NDQ0PoVLkp6ns8BIEuAi4L6q+sIW+u0OvBn4+562mc2NcpLMBE4A7u6qVknS1nU5JHUMcDpwV5Lbm7ZzgDkAVXVh03YKcENVPdOz777A1aOZw1Tg8qq6rsNaJUlb0VlgVNUPgLTodwlwySZtDwCHd1KYJOkF8ZvekqRWDAxJUisGhiSpFQNDktSKgSFJasXAkCS1YmBIkloxMCRJrRgYkqRWDAxJUisGhiSpFQNDktSKgSFJasXAkCS1YmBIkloxMCRJrXS5ROuBSW5Mcm+Se5KcOUaf45I8meT25nFuz7YTk/wkyeIkn+yqTklSO10u0boOOLuqFjXrcy9MsqCq7t2k3/er6p29DUkGgC8DbwOWALcmuWaMfSVJ20lnVxhV9UhVLWqerwTuAw5ouftRwOKqeqCq1gDfAE7uplJJUhvb5R5GkrnAkcAtY2x+Q5I7klyb5JVN2wHAwz19lrCZsEkyL8lIkpHly5ePY9WSpF6dB0aSWcCVwFlV9dQmmxcBB1XV4cB/B/5uW9+/quZX1XBVDQ8NDb34giVJY+o0MJIMMhoWl1XVVZtur6qnqurp5vl3gcEkewNLgQN7us5u2iRJfdLlLKkAFwH3VdUXNtNnv6YfSY5q6nkcuBU4JMnBSXYBTgWu6apWSdLWdTlL6hjgdOCuJLc3becAcwCq6kLgPcBHkqwDngVOraoC1iX5GHA9MABcXFX3dFirJGkrMvr3eWIYHh6ukZGRfpchSTuNJAurarhNX7/pLUlqxcCQJLViYEiSWjEwJEmtGBiSpFYMDElSKwaGJKkVA0OS1IqBIUlqxcCQJLViYEiSWjEwJEmtGBiSpFYMDElSKwaGJKmVLlfcOzDJjUnuTXJPkjPH6PO+JHcmuSvJj5Ic3rPtoab99iQuciFJfdblinvrgLOralGS3YCFSRZU1b09fR4E3lxVv0xyEjAfOLpn+/FV9ViHNUqSWuosMKrqEeCR5vnKJPcBBwD39vT5Uc8uNwOzu6pHkvTibJd7GEnmAkcCt2yh24eAa3teF3BDkoVJ5nVXnSSpjS6HpABIMgu4Ejirqp7aTJ/jGQ2MY3uaj62qpUn2ARYkub+qbhpj33nAPIA5c+aMe/2SpFGdXmEkGWQ0LC6rqqs20+cw4KvAyVX1+Mb2qlra/LsMuBo4aqz9q2p+VQ1X1fDQ0NB4n4IkqdHlLKkAFwH3VdUXNtNnDnAVcHpV/bSnfWZzo5wkM4ETgLu7qlWStHVdDkkdA5wO3JXk9qbtHGAOQFVdCJwL7AV8ZTRfWFdVw8C+wNVN21Tg8qq6rsNaJUlb0eUsqR8A2UqfM4Azxmh/ADj8+XtIkvrFb3pLkloxMCRJrRgYkqRWDAxJUisGhiSpFQNDktSKgSFJasXAkCS1YmBIkloxMCRJrRgYkqRWDAxJUisGhiSpFQNDktSKgSFJaqXLFfcOTHJjknuT3JPkzDH6JMlfJlmc5M4kr+nZ9oEkP2seH+iqznVr1/F//scI3/mrBSy+/cGuDiNJ467W3kmtuoJa/Y9Ure/8eFtcQCnJS4ChqvqnTdoPq6o7t/Le64Czq2pRs9zqwiQLqurenj4nAYc0j6OBC4Cjk+wJnAcMA9Xse01V/XJbTm5rHnngUf7wTX/CsyufY/269ZDw2rcdxrnfOpuBqQPjeShJGjdVa6hfzoO1t0EVZACm7AF7XkEG9uvsuJu9wkjyXuB+4MrmCuF1PZsv2dobV9UjVbWoeb4SuA84YJNuJwNfq1E3A3sk2R94O7CgqlY0IbEAOHEbzquV89/7F6z4xROsWvksq59dw+pVq1m44A6u+YqrwUracdUz82HNQqhngeegnoH1v6Ce+I+dHndLQ1LnAK+tqiOADwJfT3JKs22LS69uKslc4Ejglk02HQA83PN6SdO2ufZx89jSx/n5vUuoDfVr7atXreF/zv/eeB5KksbXqm8BqzdpXA9rb6M2PNXZYbc0JDVQVY8AVNWPkxwPfCfJgYwOE7WSZBZwJXBWVY37mSSZB8wDmDNnTuv91q5Zx5SMnXtrV68bl9okqRtb+hvV3d+vLV1hrEzyLze+aMLjOEaHkV7Z5s2TDDIaFpdV1VVjdFkKHNjzenbTtrn256mq+VU1XFXDQ0NDbcoCYL+5+7DHvrs/r31w2iDHn3ZM6/eRpO1u2onA4PPbpx5MpuzZ2WG3FBgfAaYkOXRjQ3Mv4kTgjK29cZIAFwH3VdUXNtPtGuD9zWyp1wNPNsF0PXBCkpcmeSlwQtM2bpJwzmVnMmPWdHaZPvofP2PWdF72G/vx3k+cPJ6HkqRxld0+DgP7Q3ZtWqZDZpHdP9ftcau2PLqU5G7g68DnRqvic8BwVb1hK/sdC3wfuAvY0DSfA8wBqKoLm1D5EqMhtAr4YFWNNPv/ftMf4M+r6q+3djLDw8M1MjKytW6/5pePPsH1l/5vHn1oGa9+46G88XeOZnCXMZJbknYgVavhuWupNYtg4CCy6ykv6OoiycKqGm7Vt0VgzAQ+C7wW2A24DPhsVW3Y4o598EICQ5Ims20JjDZf3FsLPAvMYPQK48EdMSwkSd1qExi3MhoYrwPeCJyW5FudViVJ2uFs8ZvejQ9tvK8APAKcnOT0DmuSJO2AtnqF0RMWvW1f76YcSdKOyl+rlSS1YmBIkloxMCRJrRgYkqRWDAxJUisGhiSpFQNDktSKgSFJasXAkCS1YmBIkloxMCRJrRgYkqRW2vxa7QuS5GLgncCyqnrVGNs/Abyvp47fAoaqakWSh4CVwHpgXdvFPSRJ3enyCuMSRpdeHVNVfb6qjqiqI4BPAf9YVSt6uhzfbDcsJGkH0FlgVNVNwIqtdhx1GnBFV7VIkl68vt/DSLIro1ciV/Y0F3BDkoVJ5m1l/3lJRpKMLF++vMtSJWlS63tgAO8CfrjJcNSxVfUa4CTgo0netLmdq2p+VQ1X1fDQ0FDXtUrSpLUjBMapbDIcVVVLm3+XAVcDR/WhLklSj74GRpLdgTcDf9/TNjPJbhufAycAd/enQknSRl1Oq70COA7YO8kS4DxgEKCqLmy6nQLcUFXP9Oy6L3B1ko31XV5V13VVpySpnc4Co6pOa9HnEkan3/a2PQAc3k1VkqQXake4hyFJ2gkYGJKkVgwMSVIrBoYkqRUDQ5LUioEhSWrFwJAktWJgSJJaMTAkSa0YGJKkVgwMSVIrBoYkqRUDQ5LUioEhSWrFwJAktdJZYCS5OMmyJGOulpfkuCRPJrm9eZzbs+3EJD9JsjjJJ7uqUZLUXpdXGJcAJ26lz/er6ojmcT5AkgHgy8BJwKHAaUkO7bBOSVILnQVGVd0ErHgBux4FLK6qB6pqDfAN4ORxLU6StM36fQ/jDUnuSHJtklc2bQcAD/f0WdK0SZL6qLM1vVtYBBxUVU8neQfwd8Ah2/omSeYB8wDmzJkzvhVKkv5Z364wquqpqnq6ef5dYDDJ3sBS4MCerrObts29z/yqGq6q4aGhoU5rlqTJrG+BkWS/JGmeH9XU8jhwK3BIkoOT7AKcClzTrzolSaM6G5JKcgVwHLB3kiXAecAgQFVdCLwH+EiSdcCzwKlVVcC6JB8DrgcGgIur6p6u6pQktZPRv9ETw/DwcI2MjPS7DEnaaSRZWFXDbfr2e5aUJGknYWBIkloxMCRJrRgYkqRWDAxJUisGhiSpFQNDktSKgSFJasXAkCS1YmBIkloxMCRJrRgYkqRWDAxJUisGhiSpFQNDktSKgSFJaqWzwEhycZJlSe7ezPb3JbkzyV1JfpTk8J5tDzXttydxRSRJ2gF0eYVxCXDiFrY/CLy5ql4N/Bkwf5Ptx1fVEW1XgpIkdauzNb2r6qYkc7ew/Uc9L28GZndViyTpxdtR7mF8CLi253UBNyRZmGTelnZMMi/JSJKR5cuXd1qkJE1mnV1htJXkeEYD49ie5mOrammSfYAFSe6vqpvG2r+q5tMMZw0PD1fnBUvSJNXXK4wkhwFfBU6uqsc3tlfV0ubfZcDVwFH9qVCStFHfAiPJHOAq4PSq+mlP+8wku218DpwAjDnTSpK0/XQ2JJXkCuA4YO8kS4DzgEGAqroQOBfYC/hKEoB1zYyofYGrm7apwOVVdV1XdUqS2ulyltRpW9l+BnDGGO0PAIc/fw9JUj/tKLOkJEk7OANDktSKgSFJasXAkCS1YmBIkloxMCRJrRgYkqRWDAxJUisGhiSpFQNDktSKgSFJasXAkCS1YmBIkloxMCRJrRgYkqRWOg2MJBcnWZZkzBXzMuovkyxOcmeS1/Rs+0CSnzWPD3RZpya2n9y6mLOPO4/ffsnp/LuXf5zrL7mRKpd/l7ZVZwsoNS4BvgR8bTPbTwIOaR5HAxcARyfZk9EV+oaBAhYmuaaqftlxvZpgFt/2IGcf/6esXrUagKWLf8GXPnYRTyx7kt/743f3uTpp59LpFUZV3QSs2EKXk4Gv1aibgT2S7A+8HVhQVSuakFgAnNhlrZqYLv3Tb7Lm2dW/1vbcqtVc9pkrWbN6bZ+qknZO/b6HcQDwcM/rJU3b5tqlbfKzhQ8w1uhTVfH4/9vSZxlJm+p3YLxoSeYlGUkysnz58n6Xox3My35jvzHbN6wv9thn9+1cjbRz63dgLAUO7Hk9u2nbXPvzVNX8qhququGhoaHOCtXO6fRz38O0XXf5tbZpu07jHX/wVmbMnN6nqqSdU78D4xrg/c1sqdcDT1bVI8D1wAlJXprkpcAJTZu0TY58y6v5T5d+nL1n78XA4ADTZ07j5I++nQ//hRPvpG3V6SypJFcAxwF7J1nC6MynQYCquhD4LvAOYDGwCvhgs21Fkj8Dbm3e6vyqcsBZL8gbf+f1HPtvjmbVymeZvus0BqYO9LskaaeUiTQffXh4uEZGRvpdhiTtNJIsrKrhNn37PSQlSdpJGBiSpFYMDElSKwaGJKkVA0OS1IqBIUlqZUJNq02yHPj5C9x9b+CxcSxnZ+A5T3yT7XzBc95WB1VVq5/JmFCB8WIkGWk7F3mi8Jwnvsl2vuA5d8khKUlSKwaGJKkVA+NX5ve7gD7wnCe+yXa+4Dl3xnsYkqRWvMKQJLUy6QMjycVJliW5u9+1bC9JDkxyY5J7k9yT5Mx+19SlJNOT/DjJHc35frrfNW0vSQaS3JbkO/2uZXtI8lCSu5LcnmTC/3R1kj2SfDvJ/UnuS/KGTo832YekkrwJeBr4WlW9qt/1bA9J9gf2r6pFSXYDFgLvrqp7+1xaJ5IEmFlVTycZBH4AnFlVN/e5tM4l+SNgGHhJVb2z3/V0LclDwHBVTYrvYSS5FPh+VX01yS7ArlX1RFfHm/RXGFV1EzCpFmeqqkeqalHzfCVwH3BAf6vqTo16unk52Dwm/CelJLOBfw18td+1aPwl2R14E3ARQFWt6TIswMCY9JLMBY4EbulvJd1qhmZuB5YBC6pqQp9v478Bfwxs6Hch21EBNyRZmGRev4vp2MHAcuCvm2HHryaZ2eUBDYxJLMks4ErgrKp6qt/1dKmq1lfVEcBs4KgkE3r4Mck7gWVVtbDftWxnx1bVa4CTgI82Q84T1VTgNcAFVXUk8AzwyS4PaGBMUs1Y/pXAZVV1Vb/r2V6aS/YbgRP7XUvHjgF+uxnT/wbwliR/09+SuldVS5t/lwFXA0f1t6JOLQGW9Fwtf5vRAOmMgTEJNTeBLwLuq6ov9LueriUZSrJH83wG8Dbg/v5W1a2q+lRVza6qucCpwD9U1b/tc1mdSjKzmcRBMzRzAjBhZz9W1S+Ah5O8oml6K9DpxJWpXb75ziDJFcBxwN5JlgDnVdVF/a2qc8cApwN3NeP6AOdU1Xf7WFOX9gcuTTLA6Iekb1bVpJhmOsnsC1w9+nmIqcDlVXVdf0vq3MeBy5oZUg8AH+zyYJN+Wq0kqR2HpCRJrRgYkqRWDAxJUisGhiSpFQNDktSKgSFtB0muS/LEZPnVWE1MBoa0fXye0e++SDstA0MaR0lel+TOZg2Omc36G6+qqv8FrOx3fdKLMem/6S2Np6q6Nck1wGeAGcDfVNWE/XkKTS4GhjT+zgduBZ4D/kOfa5HGjUNS0vjbC5gF7AZM73Mt0rgxMKTx91fAnwCXAZ/tcy3SuHFIShpHSd4PrK2qy5tfx/1RkrcAnwZ+E5jV/Cryh6rq+n7WKm0rf61WktSKQ1KSpFYMDElSKwaGJKkVA0OS1IqBIUlqxcCQJLViYEiSWjEwJEmt/H8I22QHPezQRwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_data = [[1, 2],\n",
    "          [2, 3],\n",
    "          [3, 1],\n",
    "          [4, 3],\n",
    "          [5, 3],\n",
    "          [6, 2]]\n",
    "y_data = [[0],\n",
    "          [0],\n",
    "          [0],\n",
    "          [1],\n",
    "          [1],\n",
    "          [1]]\n",
    "\n",
    "x1 = [x[0] for x in x_data]\n",
    "x2 = [x[1] for x in x_data]\n",
    "\n",
    "colors = [int(y[0] % 3) for y in y_data]\n",
    "plt.scatter(x1,x2, c=colors)\n",
    "\n",
    "plt.xlabel(\"x1\")\n",
    "plt.ylabel(\"x2\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 위 Data를 기준으로 가설의 검증을 통해 Logistic Classification 모델을 만들도록 하겠습니다\n",
    "* X,Y는 실재 학습에 쓰일 Data (placeholder)\n",
    "* W와 b은 학습을 통해 생성되는 모델에 쓰이는 Wegith와 Bias (초기값을 variable : 0이나 Random값으로 가능 tf.random_normal([2, 1]) )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = tf.placeholder(tf.float32, shape=[None, 2])\n",
    "Y = tf.placeholder(tf.float32, shape=[None, 1])\n",
    "\n",
    "W = tf.Variable(tf.zeros([2,1]), name='weight')\n",
    "b = tf.Variable(tf.zeros([1]), name='bias')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Sigmoid 함수를 가설로 선언합니다\n",
    "* Sigmoid는 아래 그래프와 같이 0과 1의 값만을 리턴합니다 tf.sigmoid(tf.matmul(X, W) + b)와 같습니다\n",
    "\n",
    "$$\n",
    "\\begin{align}\n",
    "sigmoid(x) & = \\frac{1}{1+e^{-x}}  \\\\\\\\\\\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "![sigmoid](https://upload.wikimedia.org/wikipedia/commons/8/88/Logistic-curve.svg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "hypothesis  = tf.div(1., 1. + tf.exp(tf.matmul(X, W) + b))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 가설을 검증할 Cost 함수를 정의합니다\n",
    "$$\n",
    "\\begin{align}\n",
    "cost(h(x),y) & = −log(h(x))  &  if  &  y=1 \\\\\\\\\\\n",
    "cost(h(x),y) & = -log(1−h(x))  &  if  &  y=0\n",
    "\\end{align}\n",
    "$$\n",
    "* 위 두수식을 합치면 아래과 같습니다\n",
    "$$\n",
    "\\begin{align}\n",
    "cost(h(x),y) & = −y log(h(x))−(1−y)log(1−h(x))\n",
    "\\end{align}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) *\n",
    "                       tf.log(1 - hypothesis))\n",
    "\n",
    "train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 추론한 값은 0.5를 기준(Sigmoid 그래프 참조)로 0과 1의 값을 리턴합니다.\n",
    "* Sigmoid 함수를 통해 예측값이 0.5보다 크면 1을 반환하고 0.5보다 작으면 0으로 반환합니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 가설을 통해 실재 값과 비교한 정확도를 측정합니다"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.int32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Tensorflow를 통한 실행을 위해 Session를 선언합니다.\n",
    "* 위의 Data를 Cost함수를 통해 학습시킨 후 모델을 생성합니다. \n",
    "* 새로운 Data를 통한 검증 수행 [5,2]의 Data로 테스트 수행 (그래프상 1이 나와야 정상입니다)\n",
    "* 새로운 Data를 통한 검증 수행 [2,2]의 Data로 테스트 수행 (그래프상 0이 나와야 정상입니다)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 0.6931472\n",
      "1000 0.41448987\n",
      "2000 0.34960732\n",
      "3000 0.3013888\n",
      "4000 0.26361898\n",
      "5000 0.23360115\n",
      "6000 0.20939068\n",
      "7000 0.18956773\n",
      "8000 0.17310147\n",
      "9000 0.15924035\n",
      "10000 0.1474307\n",
      "\n",
      "Hypothesis:  [[0.02987642]\n",
      " [0.1576593 ]\n",
      " [0.30070737]\n",
      " [0.78328896]\n",
      " [0.9407705 ]\n",
      " [0.98057085]] \n",
      "Correct (Y):  [[0.]\n",
      " [0.]\n",
      " [0.]\n",
      " [1.]\n",
      " [1.]\n",
      " [1.]] \n",
      "Accuracy:  1\n",
      "[5,2] :  [[1.]]\n",
      "[2,2] :  [[0.]]\n"
     ]
    }
   ],
   "source": [
    "test_x1 = [[5,2]] \n",
    "test_x2 = [[2,2]] \n",
    "\n",
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    for step in range(10001):\n",
    "        cost_val, _ = sess.run([cost, train], feed_dict={X: x_data, Y: y_data})\n",
    "        if step % 1000 == 0:\n",
    "            print(step, cost_val)\n",
    "\n",
    "    # Accuracy report\n",
    "    h, c, a = sess.run([hypothesis, predicted, accuracy],\n",
    "                       feed_dict={X: x_data, Y: y_data})\n",
    "    print(\"\\nHypothesis: \", h, \"\\nCorrect (Y): \", c, \"\\nAccuracy: \", a)\n",
    "#     print(\"W value : \", sess.run(W))\n",
    "#     print(\"b value : \", sess.run(b))\n",
    "    print(\"[5,2] : \",   sess.run(predicted,feed_dict={X:test_x1}))\n",
    "    print(\"[2,2] : \",   sess.run(predicted,feed_dict={X:test_x2}))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "conda_tensorflow_p36",
   "language": "python",
   "name": "conda_tensorflow_p36"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
